package cn.keniykey.mc.landterritory.landflag.api;

import java.io.File;
import java.util.Set;

import javax.annotation.Nullable;

import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

import cn.keniykey.mc.landterritory.LandTerritoryMain;
import cn.keniykey.mc.landterritory.land.api.Land;
import cn.keniykey.mc.landterritory.land.api.LandUtil;
import cn.keniykey.mc.landterritory.land.api.LandUtil.ELandPermissionLevel;
import cn.keniykey.mc.landterritory.landflag.LandFlag;
import cn.keniykey.mc.landterritory.landflag.LandFlagManager;

public abstract class JavaLandFlag extends LandFlag{
	public static final String ALL_PAR_STR = "@";
	
	/**
	 * 判断指定玩家是否有该标记权限（仅该标记参数许可）
	 */
	public static boolean hasLandFlagParameter(Land land,LandFlag flag,OfflinePlayer offplayer) {
		return hasLandFlagParameter(land, flag, offplayer.getName().toLowerCase());
	}
	/**
	 * 判断该标记是否有指定参数（仅该标记参数）
	 */
	public static boolean hasLandFlagParameter(Land land,LandFlag flag,String str) {
		final String flagname = flag.getName();
		if(!land.getFlags().containsKey(flagname)) return false;
		final Set<String> parameter = land.getFlags().get(flagname);
		if(parameter.isEmpty()) return false;
		if(flag.allowAllPlayerData() && parameter.contains(ALL_PAR_STR)) return true;
		return parameter.contains(str);
	}
	/**
	 * 判断领地是否有这个标记
	 */
	public static boolean hasLandFlag(Land land,LandFlag flag) {
		final String flagname = flag.getName();
		return land.getFlags().containsKey(flagname);
	}
	/**
	 * 综合判断指定玩家是否有该标记权限
	 * 如果返回true，表示有权限、不拦截或不阻止
	 * 此方法会按以下顺序调用方法：
	 * JavaLandFlag.hasLandFlag判断是否有该标记，没有返回true
	 * JavaLandFlag.hasLandFlagParameter判断标记是否该玩家，有就返回true
	 * LandUtil.hasLandPermission综合判断OP,Admin,Owner，LandAdminFlag,FlagAdminFlag，有权限或符合就返回true
	 */
	public static boolean hasLandFlagParameterAllMethod(Land land,LandFlag flag,Player player) {
		if(!hasLandFlag(land, flag)) return true;
		if(hasLandFlagParameter(land, flag, player)) return true;
		return LandUtil.hasLandPermission(player, land, ELandPermissionLevel.FLAG_FLAGADMIN);
	}
	
	public static boolean registerLandFlag(String flagname, JavaLandFlag flag, int version, Set<String> conflict_flags) {
		return LandFlagManager.getFlagManager().registerLandFlag(flagname, flag, version, conflict_flags);
	}
	public static void unRegisterLandFlag(Plugin plugin) {
		LandFlagManager.getFlagManager().unloadFlags(plugin);
	}
	public static void unRegisterLandFlag(JavaLandFlag javaflag) {
		if(javaflag.getPlugin() == null) return;
		LandFlagManager.getFlagManager().unloadFlag(javaflag);
	}
	protected JavaLandFlag() {}
	
	private LandFlagConfigurationFile config;
	
	public final File getDataFolder() {
		return new File(LandTerritoryMain.getPlugin().getDataFolder(), this.getDescription().getName());
	}
	public final LandFlagConfigurationFile getLandFlagConfigurationFile() {
		return (this.config == null ? this.config = new LandFlagConfigurationFile(this) : this.config);
	}
	/**
	 * 标记加载即将完成时，会触发此方法一次
	 * 请在此处初始化线程，等功能
	 * 一但发生异常，将会转入停用
	 * 注：配置文件可以通过监听LandTerritoryReloadConfigEvent
	 */
	public void onEnable() {}
	/**
	 * 标记停用即将开始时，会触发此方法一次
	 * 若使用LandFlag提供的线程调度，停用标记时会自动停止相关线程
	 * 若使用Bukkit的线程调度，请务必在此停止相关线程
	 */
	public void onDisable() {}
	/**
	 * 其它插件注册领地标记必须重写此方法返回Plugin（不可以为NULL）
	 */
	@Nullable
	public Plugin getPlugin() {
		return null;
	}
}